# Props Factory

Using `propsFactory` is ideal when there are a number of stores that need the same properties. For example, let's say we want to have a `version` property for each of our stores:

```ts title="store-props.ts"
import { propsFactory } from '@ngneat/elf';

export const {
  withVersion,
  updateVersion,
  selectVersion,
  resetVersion,
  getVersion,
  setVersion,
  setVersionInitialValue,
} = propsFactory('version', {
  initialValue: 1,
});
```

The `propsFactory` function takes the `name` of a property and the initial value and returns everything we need to add, query, and mutate that property. The `type` of a property is inferred based on the `initialValue`.

```ts title="todos.repository.ts"
import {
  withVersion,
  updateVersion,
  selectVersion,
  setVersionInitialValue,
} from '@app/store-props.ts';

setVersionInitialValue(1.1);

const store = createStore({ name: 'todos' }, withVersion());

store.update(updateVersion(2));
store.pipe(selectVersion());
store.query(getVersion);
```

If you need to use a complex type you can use `initialValue: {} as MyInterface`.

## Props Array Factory

`propsArrayFactory` is similar to `propsFactory` but for properties of type `array`:

```ts title="store-props.ts"
import { propsArrayFactory } from '@ngneat/elf';

export const {
  withSkills,
  addSkills,
  removeSkills,
  toggleSkills,
  updateSkills,
  getSkills,
  resetSkills,
  selectSkills,
  setSkills,
  setSkillsInitialValue
  inSkills,
} = propsArrayFactory('skills', {
  initialValue: [] as string[],
});
```

`propsArrayFactory` is designed to handle `primitive` arrays. For managing collections of `objects`, it's recommended to use [entitiesPropsFactory](/docs/features/entities-management/entities-props-factory).

:::tip
In addition, it's useful for managing a collection of `primitives` in one store. Consider the case of a `books` store, and a `userCollectionIds` that contains `book` ids.
:::
